home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Transmission / whiteline CD Series - Transmission.iso / utilitys / packer / packfire / fireunpa.s < prev   
Encoding:
Text File  |  1995-06-07  |  5.1 KB  |  213 lines

  1. ;********************************************* Unpackroutine von FIRE-PACK
  2. ; Eingabe: a0 = Adresse gepackter Daten
  3. ; Ausgabe: a1 = Adresse entpackter Daten
  4. ; a2 und a3 sind während der Packroutine unbelegt
  5. fire_decrunch:
  6.     movem.l    d0-a6,-(sp)
  7.     bsr.s    .getinfo        ; Kenn-Langwort holen
  8.     cmp.l    #'FIRE',d0    ; Kennung gefunden?
  9.     bne.s    .not_packed    ; nein: nicht gepackt
  10.     bsr.s    .getinfo        ; Kenn-Langwort holen
  11.     lea    -8(a0,d0.l),a5    ; a5 = Ende aller Daten
  12.     bsr.s    .getinfo        ; Länge holen
  13.     move.l    d0,(sp)        ; Originallänge: später nach d0
  14.     move.l    a1,a4
  15.     move.l    a1,a6
  16.     add.l    d7,a6        ; a6 = neues Ende
  17.                 ; a5 = Ende von Byte-Daten
  18.     move.b    -(a5),d7        ; erstes Informationslangwort
  19.     lea    .tabellen(pc),a3    ; a3 = Zeiger auf Datenbereich
  20.     moveq    #1,d6
  21.     swap    d6        ; d6 = $10000
  22.     moveq    #0,d5        ; d5 = 0 (oberes Wort: immer 0!)
  23.  
  24. .normal_bytes:
  25.     bsr.s    .get_1_bit
  26.     bcc.s    .test_if_end    ; Bit %0: keine Daten
  27.     moveq    #0,d1        ; falls zu .copy_direkt
  28.     bsr.s    .get_1_bit
  29.     bcc.s    .copy_direkt     ; Bitfolge: %10: 1 Byte direkt kop.
  30. ;    lea.l    .direkt_tab+16-.tabellen(a3),a0 ; ...siehe nächste Zeile
  31.     move.l    a3,a0
  32.     moveq    #3,d3
  33. .nextgb:    move.l    -(a0),d0        ; d0.w Bytes lesen
  34.     bsr.s    .get_d0_bits
  35.     swap    d0
  36.     cmp.w    d0,d1        ; alle gelesenen Bits gesetzt?
  37.     dbne    d3,.nextgb    ; ja: dann weiter Bits lesen
  38. .no_more: add.l    16(a0),d1     ; Anzahl der zu übertragenen Bytes
  39. .copy_direkt:
  40.     move.b    -(a5),-(a6)    ; Daten direkt kopieren
  41.     dbf    d1,.copy_direkt    ; noch ein Byte
  42. .test_if_end:
  43.     cmp.l    a4,a6        ; Fertig?
  44.     bgt.s    .strings        ; Weiter wenn Ende nicht erreicht
  45. .not_packed:
  46.     movem.l    (sp)+,d0-a6
  47.     rts
  48.  
  49. ;************************** Unterroutinen: wegen Optimierung nicht am Schlu₧
  50. .getinfo:
  51.     moveq    #3,d1
  52. .glw:    rol.l    #8,d0
  53.     move.b    (a0)+,d0
  54.     dbf    d1,.glw
  55.     rts
  56.  
  57.  
  58. .get_1_bit:
  59.     add.b    d7,d7        ; hole ein Bit
  60.     beq.s    .no_bit_found
  61.     rts
  62. .no_bit_found:
  63.     move.b    -(a5),d7
  64.     addx.b    d7,d7
  65.     rts
  66.  
  67. .get_d0_bits:
  68.     moveq    #0,d1        ; Ergebnisfeld vorbereiten
  69. .hole_bit_loop:
  70.     add.b    d7,d7        ; hole ein Bit
  71.     beq.s    .not_found    ; quellfeld leer
  72. .on_d0:    addx.w    d1,d1        ; und übernimm es
  73.     dbf    d0,.hole_bit_loop    ; bis alle Bits geholt wurden
  74.     rts
  75.  
  76. .not_found:
  77.     move.b    -(a5),d7        ; hole sonst ein weiteres Longword
  78.     addx.b    d7,d7        ; hole ein Bit
  79.     bra.s    .on_d0
  80.  
  81. ;************************************ Ende der Unterroutinen
  82.  
  83.  
  84. .strings:
  85.     moveq    #1,d0        ; 2 Bits lesen
  86.     bsr.s    .get_d0_bits
  87.     subq.w    #1,d1
  88.     bmi.s    .gleich_morestring    ; %00
  89.     beq.s    .length_2     ; %01
  90.     subq.w    #1,d1
  91.     beq.s    .length_3     ; %10
  92.     bsr.s    .get_1_bit
  93.     bcc.s    .bitset        ; %110
  94.     bsr.s    .get_1_bit
  95.     bcc.s    .length_4     ; %1110
  96.     bra.s    .length_5     ; %1111
  97.  
  98. .get_short_offset:
  99.     moveq    #1,d0
  100.     bsr.s    .get_d0_bits    ; d1:  0,  1,  2,  3
  101.     subq.w    #1,d1
  102.     bpl.s    .contoffs
  103.     moveq    #0,d0        ; Sonderfall
  104.     rts
  105.  
  106. .get_long_offset:
  107.     moveq    #1,d0        ; 2 Bits lesen
  108.     bsr.s    .get_d0_bits    ; d1:  0,  1,  2,  3
  109. .contoffs add.w    d1,d1        ; d1:  0,  2,  4,  6
  110.     add.w    d1,d1        ; d1:  0,  4,  8, 12
  111.     movem.w    .offset_table-.tabellen(a3,d1),d0/d5
  112.     bsr.s    .get_d0_bits    ; 4, 8, 12 oder 16 Bits lesen
  113.     add.l    d5,d1
  114.     rts
  115.  
  116.  
  117. .gleich_morestring:         ; %00
  118.     moveq    #1,d0        ; 2 Bits lesen
  119.     bsr.s    .get_d0_bits    ; d1:  0,  1,  2,  3
  120.     subq.w    #1,d1
  121.     bmi.s    .gleich_string    ; %0000
  122.  
  123.     add.w    d1,d1        ; d1:     0,  2,  4
  124.     add.w    d1,d1        ; d1:     0,  4,  8
  125.     movem.w    .more_table-.tabellen(a3,d1),d0/d2
  126.     bsr.s    .get_d0_bits
  127.     add.w    d1,d2        ; d2 = Stringlänge
  128.     bsr.s    .get_long_offset
  129.     move.w    d2,d0        ; d0 = Stringlänge
  130.     bra.s    .copy_longstring
  131.  
  132. .bitset:    moveq    #2,d0        ; %110
  133.     bsr.s    .get_d0_bits
  134.     moveq    #0,d0
  135.     bset    d1,d0
  136.     bra.s    .put_d0
  137.  
  138. .length_2:
  139.     moveq    #7,d0        ; %01
  140.     bsr.s    .get_d0_bits
  141.     moveq    #2-2,d0
  142.     bra.s    .copy_string
  143.  
  144. .length_3:
  145.     bsr.s    .get_short_offset    ; %10
  146.     tst.w    d0
  147.     beq    .put_d0        ; 0 ablegen
  148.     moveq    #3-2,d0
  149.     bra.s    .copy_string
  150.  
  151. .length_4:
  152.     bsr.s    .get_short_offset    ; %1110
  153.     tst.w    d0
  154.     beq.s    .vorgänger_kopieren
  155.     moveq    #4-2,d0
  156.     bra.s    .copy_string
  157.  
  158. .length_5:
  159.     bsr.s    .get_short_offset    ; %1111
  160.     tst.w    d0
  161.     beq.s    .put_ff
  162.     moveq    #5-2,d0
  163.     bra.s    .copy_string
  164.  
  165.  
  166. .put_ff:    moveq    #-1,d0
  167.     bra.s    .put_d0
  168.  
  169. .vorgänger_kopieren:
  170.     move.b    (a6),d0
  171. ;    bra.s    .put_d0
  172.  
  173. .put_d0:    move.b    d0,-(a6)
  174.     bra.s    .backmain
  175.  
  176.  
  177. .gleich_string:
  178.     bsr.s    .get_long_offset    ; Anzahl gleicher Bytes lesen
  179.     beq.s    .backmain     ; 0: zurück
  180.     move.b    (a6),d0
  181. .copy_gl: move.b    d0,-(a6)
  182.     dbf    d1,.copy_gl
  183.     sub.l    d6,d1
  184.     bmi.s    .backmain
  185.     bra.s    .copy_gl
  186.  
  187. .copy_longstring:
  188.     subq.w    #2,d0        ; Stringlänge - 2 (wegen dbf)
  189. .copy_string:            ; d1 = Offset, d0 = Anzahl Bytes -2
  190.     lea.l    2(a6,d1.l),a0    ; Hier stehen die Originaldaten
  191.     add.w    d0,a0        ; dazu die Stringlänge-2
  192.     move.b    -(a0),-(a6)    ; ein Byte auf jeden Fall kopieren
  193. .dep_b:    move.b    -(a0),-(a6)    ; mehr Bytes kopieren
  194.     dbf    d0,.dep_b     ; und noch ein Mal
  195. .backmain bra    .normal_bytes    ; Jetzt kommen wieder normale Bytes
  196.  
  197.  
  198. .direkt_tab:
  199.     dc.l    $03ff0009,$00070002,$00030001,$00030001 ; Anzahl 1-Bits
  200. .tabellen:dc.l        15-1,      8-1,      5-1,      2-1    ; Anz. Bytes
  201.  
  202. .offset_table:
  203.     dc.w     3,          0
  204.     dc.w     7,       16+0
  205.     dc.w    11,      256+16+0
  206.     dc.w    15, 4096+256+16+0
  207. .more_table:
  208.     dc.w    3,       5
  209.     dc.w    5,    16+5
  210.     dc.w    7, 64+16+5
  211. ;*************************************************** Ende der Unpackroutine
  212. ende_fire_decrunch:
  213.